package com.easyUtils.utils.md5Util;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.Random;


@Slf4j
@Data
public class MD5Util {

    private String salt;

    public MD5Util(){}

    public MD5Util(String salt){
        this.salt = salt;
    }

    /**
     * 生成加盐的MD5值
     *
     * @param text 待加密文本
     * @param salt 盐值
     * @return 加盐的MD5值，失败返回null
     */
    public  String createMD5(String text, String salt) {
        log.info("正在生成md5");
        if (StringUtils.isEmpty(text)) {
            return null;
        }
        // 如果没有指定盐值，使用默认盐值
        salt = StringUtils.defaultIfEmpty(salt, this.salt);
        try {
            String saltedText = text + salt;
            return DigestUtils.md5Hex(saltedText.getBytes(StandardCharsets.UTF_8));
        } catch (Exception e) {
            log.error("加盐MD5加密失败", e);
            return null;
        }
    }


    /**
     * 校验加盐的MD5值是否匹配
     * @param text 原文
     * @param salt 盐值
     * @param md5  MD5值
     * @return 是否匹配
     */
    public  boolean validMD5(String text, String salt, String md5) {
        log.info("正在校验md5");
        if (StringUtils.isEmpty(text) || StringUtils.isEmpty(md5)) {
            return false;
        }
        String calculatedMd5 = createMD5(text, salt);
        return md5.equalsIgnoreCase(calculatedMd5);
    }

    /**
     * 生成随机盐值
     * @return 16位随机盐值
     */
    public String generateSalt() {
        log.info("正在生成salt");
        Random random = new Random();
        StringBuilder salt = new StringBuilder();
        for (int i = 0; i < 16; i++) {
            salt.append(Integer.toHexString(random.nextInt(16)));
        }
        return salt.toString();
    }



}
